package ioc

import (
	"fmt"
	"net/url"

	"github.com/gin-gonic/gin"
)

// 管理controller对象
// 采用一个map来存储对象,存储在内存中,程序启动 解决多个impl对象依赖问题
var api = map[string]IocApi{}

// 对所有的对象统一执行
// 把所有api handler 注册root路由
func InitHttpApi(pathPrefix string, r gin.IRouter) error {
	for k, v := range api {
		err := v.Init()
		if err != nil {
			return fmt.Errorf("init %s error, %s", k, err)
		}
		urlPrefix, err := url.JoinPath(pathPrefix, k)
		if err != nil {
			return fmt.Errorf("init %s error, %s", k, err)
		}
		v.RegistryApi(r.Group(urlPrefix))
	}
	return nil
}

// 我们定义的业务对象还有基础的方法
// Init() 初始化对象的

// 托管业务实现的类
func RegistryHttpApi(obj IocApi) {
	// 避免被覆盖
	if _, ok := api[obj.Name()]; ok {
		panic("该对象已经注册:" + obj.Name())
	}
	api[obj.Name()] = obj
}

// 打印一下当前已经托管的实例的名称
func ShowLoadedApis() (names []string) {
	for k := range api {
		names = append(names, k)
	}
	return names

}
